<?php
defined('IN_CMS') or die('Direct access to Script restricted.');

class Request extends Common
{
	private $param;
	private $ext_param;
	private $language;
	private $language_id;
	private $page_number;
	
	/**
	 * Конструктор класса
	 */
	public function __construct()
	{
		$this->language = '';
		$this->language_id = 0;
		$this->parseRequest();
	}

	/**
	 * Деструктор класса
	 */
	public function __destruct()
	{
		
	}

	/**
	 * 
	 */
	private function parseRequest()
	{
		// Если в принципе есть элементы в адресной строке, то обработаем их
		if ( isset($_SERVER['REQUEST_URI']) )
		{
			// Берем все параметры адресной строки
			$param = $_SERVER['REQUEST_URI'];

			// Определяем папку, в которой находится сайт
			$path = '/' . SITE_FOLDER;
			if (substr($path, strlen($path)-1) != '/')
			{
				$path .= '/';
			}
			// Убираем из строки параметров путь к сайту
			if (strlen($param) >= strlen($path) && $path != '/')
			{
				$param = substr($param, strlen($path));
			}

			// Запишем в массив оставшиеся элементы адресной строки
			$this->param = explode('/' , $param);
			
			// Уберем из массива элементов некорректные элементы
			$this->parseParam();

			// Выделяем доп. параметры, переданные в адресной строке
			// после знака "?" (сейчас могут быть в последнем элементе массива "$param")
			$this->parseExtParam();

			// Ищем язык в первом параметре массива "$this->param"
			$this->parseLanguage();
			
			// Ищем номер страницы в последнем параметре массива "$this->param"
			$this->parsePageNumber();
		}
	}

	/**
	 * Проверка массива элементов адресной строки и удаление некорректных параметров
	 */
	private function parseParam()
	{
		// Временный массив для хранения корректных элементов
		$param = array();

		// Перебираем все элементы массива
		$cnt = count($this->param);
		for ($i=0; $i<$cnt; $i++)
		{
			if (strlen(trim($this->param[$i])) > 0 && strtolower(trim($this->param[$i])) != 'index.php')
			{
				// Если очередной элемент массива не пуст,
				// то добавим его к массиву
				$c = count($param);
				$param[$c] = trim(urldecode($this->param[$i]));
			}
		}

		// Уничтожим старый массив
		unset($this->param);

		// И запишем в него новые значения
		$this->param = $param;

		// Соберем мусор
		unset($i, $param, $c, $cnt);
	}

	/**
	 * Выделяем доп. параметры, переданные в адресной строке после знака "?"
	 */
	private function parseExtParam()
	{
		$item = $this->param[count($this->param)-1];
		$pos = strpos($item, '?');
		if ($pos !== false)
		{
			// Убираем из последнего параметра адресной строки все, что касается доп. параметров
			$val = trim(substr($item, 0, $pos));
			if ($val != '' && strtolower($val) != 'index.php')
			{
				// Записываем новое значение
				$this->param[count($this->param)-1] = $val;
			}
			else
			{
				// Последний параметр оказался пустым.
				// Удаляем этот элемент массива
				$this->param = array_slice($this->param, 0, count($this->param)-1);
			}

			// Парсим полученные доп. параметры
			$item = substr($item, $pos+1);
			$param = explode('&' , $item);

			$cnt = count($param);
			for($i=0; $i<$cnt; $i++)
			{
				$arr = explode('=', $param[$i]);
				$this->ext_param[$i]['key'] = $arr[0];
				$this->ext_param[$i]['value'] = $arr[1];
			}

			unset($item, $pos, $val, $param, $arr, $i, $cnt);
		}

	}

	/**
	 * Ищем язык в первом параметре массива "$this->param"
	 */
	private function parseLanguage()
	{
		// Получим массив используемых на сайте языков 
		// (константа LANGUAGES определена в файле "config.php")
		$languages = explode(',', LANGUAGES);
		$languages_id = explode(',', LANGUAGES_ID);

		if (count($this->param) > 0)
		{
			// Есть как минимум 1 параметр
			$cnt = count($languages);
			for ($i=0; $i<$cnt; $i++)
			{
				if ($languages[$i] == $this->param[0])
				{
					$this->language = $languages[$i];
					$this->language_id = $languages_id[$i];
					$this->param = array_slice($this->param, 1, count($this->param));
					break;
				}
			}
		}

		// Язык шаблона (сайта)
		if ( !defined('LANG') )
		{
			if ($this->language != '')
			{
				// В адресной строке указан язык
				define('LANG', $this->language);
				define('LANG_ID', $this->language_id);
			}
			else
			{
				// Берем язык из списка используемых языков на сайте
				$this->language = $languages[0];
				define('LANG', $languages[0]);
				define('LANG_ID', $languages_id[0]);
			}

			// Сохраним значения в сессии (используется в AJAX)
			$_SESSION['LANG'] = LANG;
			$_SESSION['LANG_ID'] = LANG_ID;
		}

		unset($languages, $languages_id, $cnt, $i);
	}
	
	/**
	 * 
	 */
	private function parsePageNumber()
	{
		$this->page_number = 1;
		
		if (count($this->param) > 0)
		{
			// Есть как минимум 1 параметр
			$param = $this->getParam(count($this->param)-1);
			if (strlen($param) > 4 && strtolower(substr($param, 0, 4)) == 'page')
			{
				$page_number = substr($param, 4);
				if (is_numeric($page_number))
				{
					if ((int)$page_number > 0)
					{
						$this->page_number = (int)$page_number;
					}
					$this->param = array_slice($this->param, 0, count($this->param)-1);
				}
			}
		}
		unset($param, $page_number);
	}

	/**
	 * Возвращает массив параметров адресной строки
	 * Если передан "$n" (индекс массива), то возвращается значение элемента с указанным индексом
	 */
	public function getParam($n = false)
	{
		if ($n === false)
		{
			// Индекс не указан, вернем весь массив
			return $this->param;
		}
		else
		{
			// Индекс указан
			if (count($this->param)-1 < $n)
			{
				// Индекс больше кол-ва элементов массива
				return false;
			}
			return $this->param[$n];
		}
	}

	/**
	 * Возвращает массив дополнительных параметров адресной строки
	 * (переданных в виде "?p1=1&p2=2&p3=3")
	 * Если передан "$key" (индекс ассоциативного массива), то возвращается значение элемента с указанным индексом
	 */
	public function getExtParam($key = false)
	{
		if ($key === false)
		{
			// Название ключа не указано, вернем весь массив
			return $this->ext_param;
		}
		else
		{
			// Название ключа указано, найдем значение
			$cnt = count($this->ext_param);
			for($i=0; $i<$cnt; $i++)
			{
				if ($this->ext_param[$i]['key'] == $key)
				{
					// Ключ найден, вернем значение
					return $this->ext_param[$i]['value'];
				}
			}

			unset($cnt, $key, $i);

			// Ключ не найден
			return false;
		}
	}
	
	/**
	 * 
	 * @return string $url
	 */
	public function getRequestURL()
	{
		$url = '';
		//
		for ($i=0; $i<count($this->param); $i++)
		{
			$url .= $this->param[$i] . '/';
		}
		//
		if (count($this->ext_param) > 0)
		{
			$url .= '?';
		}
		//
		for ($i=0; $i<count($this->ext_param); $i++)
		{
			if ($i > 0)
			{
				$url .= '&';
			}
			$url .= $this->ext_param[$i]['key'] . '=' . $this->ext_param[$i]['value'];
		}
		
		return $url;
	}

	/**
	 * Возвращает язык сайта
	 *
	 * @return	string
	 */
	public function getLanguage()
	{
		return $this->language;
	}
	
	/**
	 * Возвращает номер страницы
	 *
	 * @return	int
	 */
	public function getPageNumber()
	{
		return $this->page_number;
	}

	/**
	 * Возвращает ID языка сайта
	 *
	 * @return	int
	 */
	public function getLanguageID()
	{
		return $this->language_id;
	}

	
}
?>